package br.com.petsis.funcionalidades.manterPerfil;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.Funcionalidade;
import br.com.petsis.entity.Funcionario;
import br.com.petsis.entity.Perfil;
import br.com.petsis.entity.PerfilFuncionalidade;
import br.com.petsis.entity.TipoVale;
import br.com.petsis.entity.Vale;

@Name("manterPerfilController")
@Scope(ScopeType.CONVERSATION)
@Restrict(value="#{!identity.hasRole('"+Perfil.PERFIL_VETERINARIA+"')}")
public class ManterPerfilController {
	
	private static final String QRY_PERFIS = "select p from Perfil p where p.flgAtivo = 'T' and p.empresa is null";
	private static final String QRY_PERFIS_EMPRESA = "select p from Perfil p where p.empresa.idEmpresa = :idEmpresa and p.flgAtivo = 'T'";
	
	@In(create=true)
	private EntityManager entityManager;
	
	private List<SelectItem> listaFuncionalidades;
	
	private List<Perfil> listaPerfis;
	
	private Perfil perfilEdicao;

	private List<PerfilFuncionalidade> listaPerfisFuncionalidade;
	
	private boolean selecionadoTodos;
	
	private boolean selecionadoTodosPerm;
	
	@In(required=false)
	private Empresa empresaSessao;
	
	public void onLoad(){
		
	}
	
	public void onLoadList(){
		perfilEdicao = new Perfil();
		listaPerfisFuncionalidade = new ArrayList<PerfilFuncionalidade>();
	}
	
	public void excluir(){
		List<Perfil> listaRemocao = new ArrayList<Perfil>();
		for(Perfil v : getListaPerfis()){
			if(v.isSelecionado()){
				v.setFlgAtivo('F');
				entityManager.merge(v);
				listaRemocao.add(v);
			}
		}
		entityManager.flush();
		getListaPerfis().removeAll(listaRemocao);
	}
	
	public void novaPermissao(){
		getListaPerfisFuncionalidade().add(new PerfilFuncionalidade());
	}
	
	public void excluirPermissao(){
		List<PerfilFuncionalidade> listaRemocao = new ArrayList<PerfilFuncionalidade>();
		for(PerfilFuncionalidade pf : getListaPerfisFuncionalidade()){
			if(pf.isSelecionado()){
				listaRemocao.add(pf);
			}
		}
		getListaPerfisFuncionalidade().removeAll(listaRemocao);
		for(PerfilFuncionalidade pf : listaRemocao){
			if(pf.getIdPerfilFuncionalidade() != null){
				entityManager.remove(pf);
			}
		}
		entityManager.flush();
	}
	
	private void excluirPerfisFuncionalidade(Integer idPerfil){
		List<PerfilFuncionalidade> lista = entityManager.createQuery("select pf from PerfilFuncionalidade pf where pf.perfil.idPerfil = :idPerfil")
			.setParameter("idPerfil", idPerfil)
			.getResultList();
		for(PerfilFuncionalidade pf : getListaPerfisFuncionalidade()){
			entityManager.remove(pf);
//			entityManager.flush();
		}
	}
	
	public String salvar(){
		/*if(empresaSessao == null){
			FacesMessages.instance().add(Severity.ERROR,"Somente empresas podem salvar perfis.");
			return null;
		}*/
		getPerfilEdicao().setFlgAtivo('T');
		getPerfilEdicao().setEmpresa(empresaSessao);
		Perfil perfilSalvo = entityManager.merge(getPerfilEdicao());
//		entityManager.flush();
		excluirPerfisFuncionalidade(perfilSalvo.getIdPerfil());
		for(PerfilFuncionalidade pf : getListaPerfisFuncionalidade()){
			pf.setPerfil(perfilSalvo);
			pf.setFuncionalidade(entityManager.find(Funcionalidade.class, pf.getIdFuncionalidade()));
			pf.atualizaFlags();
			PerfilFuncionalidade pfNew = new PerfilFuncionalidade(pf);
			pfNew.atualizaFlags();
			entityManager.merge(pfNew);
		}
		entityManager.flush();
		setListaPerfis(null);
		FacesMessages.instance().add(Severity.INFO,"Perfil salvo com sucesso.");
		return "persisted";
	}
	
	public String editar(Perfil perfil){
		perfilEdicao = perfil;
		listaPerfisFuncionalidade = entityManager.createQuery("select pf from PerfilFuncionalidade pf where pf.perfil.idPerfil = :idPerfil")
			.setParameter("idPerfil", perfil.getIdPerfil())
			.getResultList();
		for(PerfilFuncionalidade pf : getListaPerfisFuncionalidade()){
			pf.setIdFuncionalidade(pf.getFuncionalidade().getIdFuncionalidade());
			pf.atualizaChecks();
		}
		return "editar";
	}
	
	public void selecionaTodasPermissoes(PerfilFuncionalidade perfilFuncionalidade){
		perfilFuncionalidade.setLeitura(perfilFuncionalidade.isFlgControleTotal());
		perfilFuncionalidade.setGravacao(perfilFuncionalidade.isFlgControleTotal());
		perfilFuncionalidade.setExclusao(perfilFuncionalidade.isFlgControleTotal());
		perfilFuncionalidade.setDesconto(perfilFuncionalidade.isFlgControleTotal());
	}

	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}
	
	public boolean isSelecionadoTodosPerm() {
		return selecionadoTodosPerm;
	}

	public void setSelecionadoTodosPerm(boolean selecionadoTodosPerm) {
		this.selecionadoTodosPerm = selecionadoTodosPerm;
	}

	public void selecionaTodos(){
		for(Perfil f : getListaPerfis()){
			if(isSelecionadoTodos()){
				f.setSelecionado(true);
			}else{
				f.setSelecionado(false);
			}
		}
	}
	
	public void selecionaTodosPerm(){
		for(PerfilFuncionalidade f : getListaPerfisFuncionalidade()){
			f.setSelecionado(isSelecionadoTodosPerm());
		}
	}

	public List<SelectItem> getListaFuncionalidades() {
		if (listaFuncionalidades == null) {
			listaFuncionalidades = new ArrayList<SelectItem>();
			listaFuncionalidades.add(new SelectItem(null,"Selecione"));
			List<Funcionalidade> lista = entityManager.createQuery("select f from Funcionalidade f where f.flgAtivo = 'T' and UPPER(f.dscDescricao) != UPPER(:descricao)")
				.setParameter("descricao", "GERENCIAR_EMPRESAS")
				.getResultList();
			for(Funcionalidade f : lista){
				listaFuncionalidades.add(new SelectItem(f.getIdFuncionalidade(),f.getDscNome()));
			}
		}
		return listaFuncionalidades;
	}

	public void setListaFuncionalidades(List<SelectItem> listaFuncionalidades) {
		this.listaFuncionalidades = listaFuncionalidades;
	}

	public List<Perfil> getListaPerfis() {
		if (listaPerfis == null) {
			if(empresaSessao != null){
				listaPerfis = entityManager.createQuery(QRY_PERFIS_EMPRESA)
					.setParameter("idEmpresa", empresaSessao.getIdEmpresa())
					.getResultList();
			}else{
				listaPerfis = entityManager.createQuery(QRY_PERFIS)
					.getResultList();
			}
		}
		return listaPerfis;
	}

	public void setListaPerfis(List<Perfil> listaPerfis) {
		this.listaPerfis = listaPerfis;
	}

	public Perfil getPerfilEdicao() {
		if (perfilEdicao == null) {
			perfilEdicao = new Perfil();
		}
		return perfilEdicao;
	}

	public void setPerfilEdicao(Perfil perfilEdicao) {
		this.perfilEdicao = perfilEdicao;
	}

	public List<PerfilFuncionalidade> getListaPerfisFuncionalidade() {
		if (listaPerfisFuncionalidade == null) {
			listaPerfisFuncionalidade = new ArrayList<PerfilFuncionalidade>();
		}
		return listaPerfisFuncionalidade;
	}

	public void setListaPerfisFuncionalidade(
			List<PerfilFuncionalidade> listaPerfisFuncionalidade) {
		this.listaPerfisFuncionalidade = listaPerfisFuncionalidade;
	}

	public String novo(){
		return "novo"; 
	}
	
	public String cancelar(){
		perfilEdicao = new Perfil();
		return "voltar";  
	}
	
	public void marcarDesmarcarTodos(String flag){
		boolean flg = flag.equals("true") ? true : false; 
		for(PerfilFuncionalidade pf : getListaPerfisFuncionalidade()){
			pf.setLeitura(flg);
			pf.setGravacao(flg);
			pf.setExclusao(flg);
			pf.setDesconto(flg);
			pf.setFlgControleTotal(flg);
		}
	}
	
	public void inserirTodasFuncionalidades(){
		setListaPerfisFuncionalidade(null);
		PerfilFuncionalidade pf;
		for(SelectItem s : getListaFuncionalidades()){
			if(s.getValue() != null){
				pf = new PerfilFuncionalidade();
				pf.setIdFuncionalidade((Integer)s.getValue());
				getListaPerfisFuncionalidade().add(pf);
			}
		}
	}

}
